#ifndef ARGPARSER_H
#define ARGPARSER_H

#include <string>
#include <map>
#include <vector>

/**
 * Classe permettant de traiter les arguments donnés à main de manière
 * efficace. Les arguments sont lus et séparés par des "marqueurs
 * d'options". Un "marquer d'option" est soit --option ou -o (la même
 * lettre, minuscule ou majuscule). Un conteneur associatif est
 * rempli, indexé par la version courte du marqueur d'option (quel que
 * soit le marqueur donné en entrée), qui contient les arguments sous
 * forme de vector de string.
 *
 * Les options peuvent être lues en utilisant la méthode lireOption.
 *
 * Si le marqueur "-h" ou "--help" est utilisé, cela change l'état
 * d'un commutateur interne permettant l'affichage de l'aide. Les
 * messages d'aides doivent être fournis par la méthode setTextesAide.
 *
 * @author Johan "Solo" Luisier
 */
class ArgParseur
{
public:
  ArgParseur( int argc, char* argv[] );
  ArgParseur( int argc, char* argv[],
	     const std::map< std::string, std::string >& help );
  ~ArgParseur();
  const bool& initialisationFaite() const;
  const bool& interpreteArgs( int argc, char* argv[] );
  const bool& demandeAide() const;
  void setTextesAide( const std::map< std::string, std::string >& help );
  int lireOption( const std::string& key,
                  std::vector< std::string >& values ) const;
  void montreAide( const bool& ajust = true ) const;
  friend std::ostream& operator<<( std::ostream& os, const ArgParseur& par );
protected:
  void parseArgs( int argc, char* argv[] );
  /**
   * Contient \e true une fois que les arguments ont été lus avec
   * succès.
   */
  bool InitialisationFaite;
  /**
   * Contient \e true si "-h" ou "--help" est trouvé dans les
   * arguments.
   */
  bool DemandeAide;
  /**
   * Stocke les options données à main, indexées par la version courte
   * du marqueur d'option.
   */
  std::map< std::string, std::vector< std::string > > OptionsLues;
  /**
   * Stocke les messages d'aide. La structure est indexée par la
   * version courte du marqueur d'option.
   */
  std::map< std::string, std::string > TextesAide;
};

#endif // ARGPARSER_H
